package com.cc.optional;

import org.junit.Test;

import java.util.Optional;

/**
 * @Author C.
 * @Date 2019-03-31 16:15
 * <p>
 * <p>
 * Java 8中提供了java.util.Optional<T> 类，是一个容器类，
 * 代表一个值存在或不存在，原来用 null 表示一个值不存在，现在 Optional 可以更好的表达这个概念。
 *
 * 总之这个Optional类其实就是一个封装了一个元素的容器，而这个元素可以是null也可以是其它任意类型的
 */
public class OptionalTest {

    /**
     * Optional常用方法有以下这些：
     * Optional.of(T t) : 创建一个 Optional 实例
     * Optional.empty() : 创建一个空的 Optional 实例
     * Optional.ofNullable(T t): 若 t 不为 null, 创建 Optional 实例, 否则创建空实例
     * T get()：获取 Optional 中的值
     * isPresent() : 判断是否包含值
     * orElse(T t) : 如果调用对象包含值，返回该值，否则返回 t
     * orElseGet(Supplier s) : 如果调用对象包含值，返回该值，否则返回 s 获取的值
     * map(Function f): 如果有值对其处理，并返回处理后的 Optional，否则返回 Optional.empty()
     * flatMap(Function mapper): 与 map 类似，要求返回值必须是 Optional
     */


    /**
     * Optional.of(T t) : 创建一个 Optional 实例
     */
    @Test
    public void test_of() {
        // Optional.of(T t)
        Optional<String> optional = Optional.of("321");
        System.out.println(optional);//Optional[321]
        // 下面这句代码会报NullPointerException
        //Optional<String> optional2 = Optional.of(null);
    }

    /**
     *  Optional.empty() : 创建一个空的 Optional 实例
     */
    @Test
    public void test_empty() {
        // Optional.empty()
        Optional<Object> emptyOptional = Optional.empty();
        System.out.println(emptyOptional);
    }

    /**
     * Optional.ofNullable(T t): 若 t 不为 null, 创建 Optional 实例, 否则创建空实例
     */
    @Test
    public void test_ofNullable() {
        // Optional.ofNullable(T t)
        Optional<String> nullableOptional = Optional.ofNullable("123");
        System.out.println(nullableOptional);//Optional[123]
        // 下面这句代码不会报错，因为ofNullable(T t)创建Optional时允许t为null，相当于Optional.empty()
        Optional<Object> nullableOptional2 = Optional.ofNullable(null);
        System.out.println(nullableOptional2);//Optional.empty
    }

    /**
     * T get()：获取 Optional 中的值
     *
     * 通过get()方法可以从Optional实例中获取到存放的值。
     */
    @Test
    public void test_get() {
        Optional<String> optional = Optional.of("123");
        String str = optional.get();
        System.out.println(str);//输出123
    }

    /**
     * isPresent() : 判断是否包含值
     * isPresent()判断是否包含值，有点像是我们判断一个集合的size是否大于 0
     */
    @Test
    public void test_isPresent() {
        Optional<String> optional = Optional.of("123");
        boolean b = optional.isPresent();
        System.out.println(b);// 输出true

        optional = Optional.ofNullable(null);
        b = optional.isPresent();
        System.out.println(b);// 输出false
    }
}
